#!/usr/bin/python
# -*- coding: utf-8 -*-

##
 # Copyright 2009 Caio Souza
 # This file is part of Rpyg.
 #
 # Rpyg is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
 # the Free Software Foundation, either version 3 of the License, or
 # (at your option) any later version.
 #
 # Rpyg is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
 # along with Rpyg. If not, see <http://www.gnu.org/licenses/>.
 ##

'''Módulo de definição dos eventos'''

WALK_IN, WALK_OUT, ACT_FROM_NORTH, ACT_FROM_SOUTH, ACT_FROM_EAST, ACT_FROM_WEST = range(0, 6)
'''Constantes de definição do gatilho do evento.'''

class Event(object):
    '''Define um evento do jogo.'''

    def __init__(self, trigger, action = None, args = tuple(), kwargs = {}):
        '''Cria um novo evento.
        
        O parâmetro 'trigger' deve ser uma das constantes definas.
        A ação é um objeto que pode ser chamado como uma função (callable).
        Opcionalmente os argumentos dessa função.
        
        '''
        
        if action is not None:
            if not callable(action): raise TypeError('Action of a "' + type(self).__name__ + '" class must be callable.')
            self.action = action
            '''Ação a ser executada.'''
        
        self.trigger = trigger
        '''Gatilho que deve ser satisfeito para execução.'''
        
        if not isinstance(args, (tuple, list)): raise TypeError('Args of a "' + type(self).__name__ + '" class must be a tuple or list.')
        self.args = args
        '''Tupla de argumentos da ação.'''
        
        if not isinstance(kwargs, dict): raise TypeError('Kwargs of a "' + type(self).__name__ + '" class must be a dict.')
        self.kwargs = kwargs
        '''Dicionário de argumentos da ação.'''

    def execute(self, trigger):
        '''Executa o evento caso o gatilho seja satisfeito.'''
        
        if (self.trigger == trigger): self.action(*self.args, **self.kwargs)
